//
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Official repository: https://github.com/CPPAlliance/url
//

// Test that header file is self-contained.
#include <boost/url/rfc/charsets.hpp>
#include <boost/static_assert.hpp>

#include "test_rule.hpp"
#include "test_suite.hpp"

namespace boost {
namespace urls {

BOOST_STATIC_ASSERT(grammar::is_charset<unreserved_chars_t>::value);
BOOST_STATIC_ASSERT(grammar::is_charset<reserved_chars_t>::value);
BOOST_STATIC_ASSERT(grammar::is_charset<gen_delim_chars_t>::value);
BOOST_STATIC_ASSERT(grammar::is_charset<subdelim_chars_t>::value);
BOOST_STATIC_ASSERT(grammar::is_charset<pchars_t>::value);
BOOST_STATIC_ASSERT(grammar::is_charset<query_chars_t>::value);
BOOST_STATIC_ASSERT(grammar::is_charset<fragment_chars_t>::value);

class charsets_test
{
public:
    void
    testLuts()
    {
        test_char_set(
            unreserved_chars,
                "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                "abcdefghijklmnopqrstuvwxyz"
                "0123456789"
                "-._~");

        // Need to construct this string_view
        // manually because of the leading null
        {
            char const res[] =
                "\x00\x01\x02\x03\x04\x05\x06\x07" "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
                "\x10\x11\x12\x13\x14\x15\x16\x17" "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
                "\x20\x21\x22\x23\x24\x25\x26\x27" "\x28\x29\x2a\x2b\x2c"      "\x2f"
                                                           "\x3a\x3b\x3c\x3d\x3e\x3f"
                "\x40"
                                                               "\x5b\x5c\x5d\x5e"
                "\x60"
                                                               "\x7b\x7c\x7d"  "\x7f"
                "\x80\x81\x82\x83\x84\x85\x86\x87" "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
                "\x90\x91\x92\x93\x94\x95\x96\x97" "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
                "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7" "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
                "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7" "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
                "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7" "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
                "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7" "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
                "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7" "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
                "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7" "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
            test_char_set(
                reserved_chars,
                string_view(res, sizeof(res) - 1));
        }

        test_char_set(
            gen_delim_chars,
                ":/?#[]@");

        test_char_set(
            subdelim_chars,
                "!$&()*+,;=\x27");

        test_char_set(
            pchars,
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            "abcdefghijklmnopqrstuvwxyz"
            "0123456789"
            "-._~"
            "!$&'()*+,;="
            ":@");

        test_char_set(
            query_chars,
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            "abcdefghijklmnopqrstuvwxyz"
            "0123456789"
            "-._~"
            "!$&'()*+,;="
            ":@"
            "/?");

        test_char_set(
            fragment_chars,
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            "abcdefghijklmnopqrstuvwxyz"
            "0123456789"
            "-._~"
            "!$&'()*+,;="
            ":@"
            "/?");
    }

    void
    run()
    {
        testLuts();
    }
};

TEST_SUITE(
    charsets_test,
    "boost.url.charsets");

} // urls
} // boost
